package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.CheckGroupDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.CheckGroup;
import com.itheima.service.CheckGroupService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 检查组管理
 */
@Service  //交给dubbo管理
@Transactional    //注解驱动
public class CheckGroupServiceImpl implements CheckGroupService {

    //本地注入checkGroupDao
    @Autowired
    private CheckGroupDao checkGroupDao;

    /**
     * 新增检查组
     *
     * @param checkGroup   检查组对象
     * @param checkitemIds 检查组包含的检查项的id
     */
    @Override
    public void add(CheckGroup checkGroup, Integer[] checkitemIds) {

        //1 添加检查组
        checkGroupDao.add(checkGroup);
        //2 通过中间表，让检查组合检查项建立外键关系
        //获取检查组的id
        Integer checkGroupId = checkGroup.getId();
        //对前端的检查项数据进行非空判断
        setCheckGroupAndCheckItem(checkGroupId,checkitemIds);
    }

    /**
     * 查询所有的组的信息
     *
     * @param queryPageBean 封装的类  包含页数  每页条数  模糊查询的条件
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {

        //取出数据
        Integer currentPage = queryPageBean.getCurrentPage();  //页数
        Integer pageSize = queryPageBean.getPageSize();         //每页条数
        String queryString = queryPageBean.getQueryString();    //模糊查询条件
        //里面自动完成分页方法，不用管了
        PageHelper.startPage(currentPage,pageSize);

        //调用dao  进行模糊查询
        Page<CheckGroup> page = checkGroupDao.findByCondition(queryString);
        long total = page.getTotal();   //总条数
        List<CheckGroup> result = page.getResult();  //所有的数据集合  封装成了  Page 对象


        return new PageResult(total,result);
    }

    /**
     * 通过id 插叙检查组信息
     *
     * @param id 通过id进行查询
     * @return
     */
    @Override
    public CheckGroup findById(Integer id) {

        //通过检查组的id查询检查组合他所关联的所有的检查项
        return checkGroupDao.findCheckGroupById(id);
    }

    /**
     * 通过id 通过检查组的id查询所有的检查项
     *
     * @param id 通过id进行查询
     * @return 所有检查组的集合
     */
    @Override
    public List<Integer> findCheckItemIdsByCheckGroupId(Integer id) {

        return checkGroupDao.findCheckItemIdsByCheckGroupId(id);
    }

    /**
     * 通过
     *
     * @param checkGroup   检查组
     * @param checkitemIds 所有检查项的id
     * @return
     */
    @Override
    public void update(CheckGroup checkGroup, Integer[] checkitemIds) {
        //修改检查组的基本信息
        checkGroupDao.update(checkGroup);
        //通过检查组id清除当前检查组的所有关联
        Integer checkGroupId = checkGroup.getId();    //获取检查组的id
        checkGroupDao.deleteAssoication(checkGroupId);  //调用方法进行删除所有检查项的

        //新建检查组的关联
        setCheckGroupAndCheckItem(checkGroupId,checkitemIds);

    }

    /**
     * 删除检查组
     *
     * @param id
     */
    @Override
    public void delete(Integer id) {

        //判断是否有外键关系
       Long count = checkGroupDao.findContByCheckGroupId(id);

       if(count > 0){
           //count > 0 表示有外键关系
          new RuntimeException("检查组正在被使用");  //抛一个运行时异常
       }
        //通过检查组的id删除中间表中所有的关联关系
        checkGroupDao.deleteAssoication(id);

        //删除检查组
        checkGroupDao.delete(id);
    }

    /**
     * 查询所有的检查组
     *
     * @return 所有的检查组的集合
     */
    @Override
    public List<CheckGroup> findAll() {
        return checkGroupDao.findAll();
    }




    /**
     * 通过检查组的id和检查项的id建立多对多关系
     * @param checkGroupId  检查组的id
     * @param checkitemIds  检查项的id
     */
    public void setCheckGroupAndCheckItem( Integer checkGroupId,Integer[] checkitemIds) {
        //对前端的检查项数据进行非空判断
        if (checkitemIds != null && checkitemIds.length > 0) {
            //表示前端传过来的有数据
            Map<String, Integer> map = new HashMap<>();
            for (Integer checkitemId : checkitemIds) {
                map.put("checkitemId", checkitemId);
                map.put("checkgroupId", checkGroupId);
                //调用dao，添加外键关系
                checkGroupDao.setCheckGroupAndCheckItem(map);
            }
        }
    }
}
